using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Linq.Expressions;
using System.Web;
using Campus.Entities;

namespace CampusSite.Models
{
    public class PagoMensualRepository : IPagoMensualRepository
    {
        CampusSiteContext context = new CampusSiteContext();

        public IQueryable<PagoMensual> All
        {
            get { return context.PagoMensuals; }
        }

        public IQueryable<PagoMensual> AllIncluding(params Expression<Func<PagoMensual, object>>[] includeProperties)
        {
            IQueryable<PagoMensual> query = context.PagoMensuals;
            foreach (var includeProperty in includeProperties)
            {
                query = query.Include(includeProperty);
            }
            return query;
        }

        public PagoMensual Find(int id)
        {
            return context.PagoMensuals.Find(id);
        }

        public void InsertOrUpdate(PagoMensual pagomensual)
        {
            if (pagomensual.PagoId == default(int))
            {
                // New entity
                pagomensual.IsBorrado = false;
                context.PagoMensuals.Add(pagomensual);
            }
            else
            {
                // Existing entity
                context.Entry(pagomensual).State = EntityState.Modified;
            }
        }

        public void PagarTodo(int EstudianteId, int ActividadId)
        {
            var actividad = context.Actividades.Find(ActividadId);
            if (!"mensual".Equals(actividad.FrecuenciaDePago.Nombre.ToLower()))
            {
                throw new ArgumentException("ActivadId no pertenece a una actividad Mensual");
            }

            var estudiante = context.Estudiantes.Find(EstudianteId);
            var ultimoPago = context.PagoMensuals
                                .Where(p => p.EstudianteId == EstudianteId && p.ActividadId == ActividadId && !p.IsBorrado)
                                .OrderByDescending(p => p.FechaDePago).FirstOrDefault();
            int mesActual = DateTime.Now.Month;
            int primerMesAdeudado = 3;//Inicio de Actividad TODO: obtener de Tabla de Configuraciones

            if (ultimoPago != null && ultimoPago.FechaDePago.Year == DateTime.Now.Year)
            {
                primerMesAdeudado = ultimoPago.Mes + 1;
            }

            for (int i = primerMesAdeudado; i <= mesActual; i++)
            {
                var pago = new PagoMensual
                {
                    EstudianteId = EstudianteId,
                    ActividadId = ActividadId,
                    FechaDePago = DateTime.Now,
                    Monto = estudiante.CuotaMensual,
                    IsBorrado = false,
                    Mes = i
                };

                InsertOrUpdate(pago);
            }
        }

        public void Delete(int id)
        {
            var pagomensual = context.PagoMensuals.Find(id);
            pagomensual.IsBorrado = true;
            InsertOrUpdate(pagomensual);
            //context.PagoMensuals.Remove(pagomensual);
        }

        public void Save()
        {
            context.SaveChanges();
        }

        public void Dispose()
        {
            context.Dispose();
        }
    }

    public interface IPagoMensualRepository : IDisposable
    {
        IQueryable<PagoMensual> All { get; }
        IQueryable<PagoMensual> AllIncluding(params Expression<Func<PagoMensual, object>>[] includeProperties);
        PagoMensual Find(int id);
        void InsertOrUpdate(PagoMensual pagomensual);
        void PagarTodo(int EstudianteId, int ActividadId);
        void Delete(int id);
        void Save();
    }
}